/*
 * server.c
 * projet Unix
 *
 * @authors Dogru Ismaïl <is.dogru@gmail.com>
 * @authors Pauchet Antoni <antonipauchet@gmail.com>
 *
 */

#include "serveur.h"
#define LOGDEF "logerr"

int main(int argc, char *argv[]) {

	int mySocket;
	struct sockaddr_in adr;
	int lock, port;

	switch (argc) {
	default:
		fprintf(stderr, "Usage: %s portHote [nomFichier]\n", argv[0]);
		exit(2);
		break;
	case 3:
		if (verifierNumPort(argv[1]) == -1) {
			fprintf(stderr, "Numero de port invalide : %s\n", argv[1]);
 			exit(2);
		}
		if (freopen(argv[2], "w", stderr) == NULL) {
			fprintf(stderr, "Erreur d'ouverture de %s\n", argv[2]);
			exit(2);
		}
		break;
	case 2:
		if (verifierNumPort(argv[1]) == -1) {
			fprintf(stderr, "Numero de port invalide : %s\n", argv[1]);
			exit(2);
		}
		 if (freopen(LOGDEF, "w", stderr) == NULL) {
			fprintf(stderr, "Erreur d'ouverture de %s\n", LOGDEF);
 			exit(2);
		}
		break;
	}

	if ((lock = open(LOCK, O_EXCL | O_CREAT, S_IRGRP)) == -1) {
		if (errno == EEXIST) {
			fprintf(stderr, "Un serveur de jeu est dejà en cours d'execution\n");
			exit(SERV_LOCK);
		}
	}

	/**************************************************************************/
	/* initialisation de l'ecoute d'un port */
	mySocket = 0;
	/** definition de la famille de socket à utiliser */
	adr.sin_family = AF_INET;

	/** initialisation du socket TCP à utiliser*/
	SYS(mySocket=socket(adr.sin_family, SOCK_STREAM, IPPROTO_TCP));
	/** Recuperation de l'adresse ip du système,
	 *  htonl pour une plus grande portabilite
	 */
	adr.sin_addr.s_addr = htonl(INADDR_ANY);

	/**Conversion de la valeur Port en Host to Network Short
	 * si 0 alors port->aleatoire
	 */

	port = atoi(argv[1]);

	adr.sin_port = htons(port);

	/**On associe les informations de adr au socket
	 * afin de creer celui-ci
	 * en cas d'erreur on sort du programme et on ferme le socket serveur
	 */
	if (bind(mySocket, (struct sockaddr *) &adr, sizeof(struct sockaddr_in)) < 0) {
		fprintf(stderr, "Bind refuse\n");
		SYS(close(mySocket));
		exit(3);
	}

	/* Limitation du nombre de joueurs à MAXPLAYERS */
	if (listen(mySocket, MAX_JOUEURS) < 0) {
		fprintf(stderr, "Listen refuse\n");
		SYS(close(mySocket));
		exit(4);
	}

	partie(mySocket, lock);
	exit(4);
}
/* fin du main */

